//
//  TestCycleRetain.m
//  blockTestOfBlog
//
//  Created by Song on 2018/5/9.
//  Copyright © 2018年 Song. All rights reserved.
//

#import "TestCycleRetain.h"

@implementation TestCycleRetain

-(instancetype)init {
    self = [super init];
    if (self) {
        
//        //会循环引用
//        self.myblock = ^{
//            [self dosomething];
//        };
//        
//        //会循环引用
//        __block TestCycleRetain * weakSelf = self;
//        self.myblock = ^{
//            [weakSelf dosomething];
//        };
        
//        //不会循环引用
//        __weak TestCycleRetain *weakSelf1 = self;
//        self.myblock = ^{
//            [weakSelf1 dosomething];
//        };
        
//        //不会循环引用
//        __unsafe_unretained TestCycleRetain *weakSelf2 = self;
//        self.myblock = ^{
//            [weakSelf2 dosomething];
//        };

        // 不会循环引用 （推荐使用）
        /*
            在上述使用Block中，虽说使用__weak，但是此处会有一个隐患，你不知道self什么时候会被释放，为了保证在Block内不会被释放，我们添加__strong。更多的时候需要配合strongSelf使用
         */
        __weak TestCycleRetain *weakSelf3 = self;
        self.myblock = ^{
            __strong TestCycleRetain *strongSelf = weakSelf3;
            [strongSelf dosomething];
        };
        
        NSLog(@"myblock is %@", self.myblock);
        
    }
    return self;
}

-(void)dosomething {
    NSLog(@"do some thing");
}

-(void)dealloc {
    NSLog(@" - 没有循环引用 - ");
}

@end
